﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Chinesys.Entities.Constants;
using Chinesys.Domain;
using Chinesys.Domain.InputValidations;
using Chinesys.UI.Helpers;
using Chinesys.Entities;
using Chinesys.Domain.BizRules;

namespace Chinesys.UI.Orders
{
    public partial class Orders : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            CheckUserInRole(Constants.Roles.Customer);

            Master.PageTitle = "Comprar Productos";
            ClearMessages();


            if (!IsPostBack)
            {
                rptProductsGrid.DataSource = ProductDomain.GetAll();
                rptProductsGrid.DataBind();
            }
        }

        protected void rptProductsGrid_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "AddToCart")
            {
                List<InputValidationError> errors = new List<InputValidationError>();

                ////Traigo el pedido para el cliente, creando uno nuevo, o si ya existe un pedido en progreso utilizo ese.
                OrderEntity order = FetchOrderForCustomer(User.Id);

                ////Consigo los parametros necesarios desde la pagina.
                int productID = Convert.ToInt32(e.CommandArgument);
                int quantity = TypeHelper.ConvertToType<Int32>(((TextBox)e.Item.FindControl("txtQuantity")).Text, "Cantidad", errors);

                ////Agrego el producto al carrito.
                OrderDetailEntity detail = AddDetailsForOrder(order, productID, quantity);


                if (errors.Any())
                {
                    validationSummary.Errors = errors;
                }
                else
                {
                    //Guardo los cambios en el pedido 
                    //validando todos los campos de entrada y realizando
                    //las validaciones de negocio necesarias.
                    try
                    {
                        OrderDomain.Save(order);

                        //lblInfo.Text = string.Format("Se ha agregado al pedido numero '{0}': {1} {2} con un valor de {3} pesos argentinos cada unidad.",
                        //                                order.Id,
                        //                                detail.Quantity,
                        //                                detail.Product.Name,
                        //                                (detail.Product.Price * order.DolarPrice).ToString("C"));
                        lblInfo.Visible = true;
                    }
                    catch (InputValidationException ex)
                    {
                        validationSummary.Errors = ex.Validator.Errors;
                    }
                    catch (BizRulesException ex)
                    {
                        hdnBizRulesException.Value = ex.Message;
                    }
                }

            }
        }

        private OrderEntity FetchOrderForCustomer(int customerID)
        {
            OrderEntity order = OrderDomain.GetActiveOrderForCustomer(customerID);
            if (order == null)
            {
                order = new OrderEntity();
                order.CustomerId = customerID;
                order.DateBegin = DateTime.Today;
                order.DolarPrice = DolarHelper.GetDolarPrice();
            }

            return order;
        }

        private OrderDetailEntity AddDetailsForOrder(OrderEntity order, int productID, int quantity)
        {
            if (order != null && order.OrderDetails != null)
            {
                ProductEntity product = ProductDomain.GetByID(productID);

                OrderDetailEntity detail = new OrderDetailEntity();
                detail.ProductId = product.Id;
                detail.Product = product;
                detail.UnitPrice = product.Price;
                detail.Quantity = quantity;
                detail.CurrentState = RowState.New;
                order.OrderDetails.Add(detail);

                return detail;
            }

            throw new BizRulesException("No se pudo agregar detalles al pedido. Contacte con el administrador para mas información.");
        }

        private void ClearMessages()
        {
            lblInfo.Visible = false;
            validationSummary.Clear();
        }
    }
}